﻿using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Linq;
using System.Windows.Forms;
using GSQ.BusinessEntities;
using GSQ.BusinessLogic;


namespace UIapp.Dialogos
{
    public partial class frmFacturasPagos : Plantillas.frmDialogPlantilla, Interfaces.IPantalla
    {
        public frmFacturasPagos(FACTURAS entity)
        {
            InitializeComponent();
            try
            {
                this.cmbTipoPago.DisplayMember = "TIPO";
                this.cmbTipoPago.ValueMember = "ID";
                this.cmbTipoPago.DataSource = new FacturasPagosBL().GetAllFacturasPagosTipos();

                this.cmbBanco.DisplayMember = "BANCO";
                this.cmbBanco.ValueMember = "ID";
                this.cmbBanco.DataSource = new BancosBL().GetAll().Where(a => a.ACTIVO == true).ToList();

                this.lblIdFactura.Text = entity.NRO_FACTURA.ToString();
                this.lblCliente.Text = entity.CLIENTES.CLIENTE;
                this.lblFechaFactura.Text = entity.FECHA_HORA.ToString("dd/MM/yyyy hh:mm tt");
                this.lblMonto.Text = (entity.M_TOTAL - entity.M_PAGADO).ToString("N2");
                this.Entity = entity;

                this.dtpFechaPago.Value = new UtilidadesBL().GetDate().Date;
                if (entity.FECHA_HORA.Date == new UtilidadesBL().GetDate().Date)
                    this.dtpFechaPago.Enabled = false;

                this.CuadrarConFactura = true;
                this.CalcularTotal();
            }
            catch (Exception ex)
            {
                Comun.ShowMessage(ex);
                this.cmbTipoPago.Enabled = false;
            }
        }

        #region Variables
        FACTURAS Entity = null;
        double ncMontoPendiente;
        decimal ncId;
        #endregion

        #region Metodos auxiliares
        private void CalcularTotal()
        {
            if (this.Entity.FACTURAS_PAGOS.Count > 0)
            {
                decimal Pendiente = 0, Pagado = 0, devolver = 0;
                foreach (var rw in this.Entity.FACTURAS_PAGOS)
                {
                    Pagado = Pagado + rw.MONTO;
                }
                Pendiente = (this.Entity.M_TOTAL - this.Entity.M_PAGADO) - Pagado;
                devolver = Pagado - (this.Entity.M_TOTAL - this.Entity.M_PAGADO);

                if (Pendiente > 0)
                    this.lblPendientePagar.Text = Pendiente.ToString("N2");
                else
                    this.lblPendientePagar.Text = "0.00";

                this.lblMontoPagado.Text = Pagado.ToString("N2");

                if (devolver > 0)
                    this.lblMontoDevolver.Text = devolver.ToString("N2");
                else
                    this.lblMontoDevolver.Text = "0.00";
            }
            else
            {
                this.lblMontoDevolver.Text = "0.00";
                this.lblMontoPagado.Text = "0.00";
                this.lblPendientePagar.Text = (this.Entity.M_TOTAL - this.Entity.M_PAGADO).ToString("N2");
            }
        }

        public bool CuadrarConFactura
        {
            get;
            set;
        }
        #endregion

        #region Implementacion IPantalla
        public int ComandosSoportados
        {
            get { return 0; }
        }

        public void Nuevo()
        {
            throw new NotImplementedException();
        }

        public void Modificar()
        {
            throw new NotImplementedException();
        }

        public void Eliminar()
        {
            throw new NotImplementedException();
        }

        public void Refrescar()
        {
            throw new NotImplementedException();
        }

        public void Buscar()
        {
            throw new NotImplementedException();
        }

        public void AgregarProducto(Controles.TransferEntity tranferEntity)
        {
            throw new NotImplementedException();
        }
        #endregion

        #region Tratamiento de eventos
        private void cmbTipoPago_SelectedIndexChanged(object sender, Telerik.WinControls.UI.Data.PositionChangedEventArgs e)
        {
            switch (this.cmbTipoPago.SelectedIndex)
            {
                case 0:
                    this.pnlPortador.Enabled = false;
                    this.txtPortador.Clear();
                    this.txtTelefono.Clear();
                    this.txtNroDocumento.Enabled = false;
                    this.txtNroDocumento.Clear();
                    break;
                case 3:
                    this.pnlPortador.Enabled = false;
                    this.txtPortador.Clear();
                    this.txtTelefono.Clear();
                    this.txtNroDocumento.Enabled = true;
                    this.txtNroDocumento.Clear();
                    break;
                default:
                    this.pnlPortador.Enabled = true;
                    this.txtPortador.Clear();
                    this.txtTelefono.Clear();
                    this.txtNroDocumento.Enabled = true;
                    this.txtNroDocumento.Clear();
                    break;
            }
        }

        private void btnAgregarPago_Click(object sender, EventArgs e)
        {
            double monto = 0;

            #region Validaciones
            if (this.cmbTipoPago.SelectedIndex < 0)
            {
                Comun.ShowInMainMessage("Seleccione un tipo de pago.");
                this.cmbTipoPago.Focus();
                return;
            }
            else if (this.dtpFechaPago.Value.Date < this.Entity.FECHA_HORA.Date)
            {
                Comun.ShowInMainMessage("Fecha pago debe ser mayor o igual a la de factura.");
                this.dtpFechaPago.Focus();
                return;
            }

            if (!double.TryParse(this.txtMonto.Text.Trim(), out monto))
            {
                Comun.ShowInMainMessage("El monto es un valor numérico.");
                this.txtMonto.Focus();
                return;
            }

            if (monto <= 0)
            {
                Comun.ShowInMainMessage("Monto a pagar tiene que ser mayo a CERO");
                this.txtMonto.Focus();
                return;
            }
            if (this.cmbTipoPago.SelectedIndex == 3 && this.txtNroDocumento.Text.Trim() == string.Empty)
            {
                Comun.ShowInMainMessage("Requerido el numero de documento.");
                this.txtNroDocumento.Focus();
                return;
            }
            else if (this.cmbTipoPago.SelectedIndex == 1 || this.cmbTipoPago.SelectedIndex == 2 || this.cmbTipoPago.SelectedIndex == 4)
            {
                if (this.cmbBanco.SelectedIndex < 0)
                {
                    Comun.ShowInMainMessage("Requerido seleccionar banco.");
                    this.cmbBanco.Focus();
                    return;
                }
                else if (this.txtNroDocumento.Text.Trim() == string.Empty)
                {
                    Comun.ShowInMainMessage("Requerido el numero de documento.");
                    this.txtNroDocumento.Focus();
                    return;
                }
                else if (this.txtPortador.Text.Trim() == string.Empty)
                {
                    Comun.ShowInMainMessage("Requerido el nombre del portador");
                    this.txtPortador.Focus();
                    return;
                }
                else if (this.txtTelefono.Text.Trim() == string.Empty)
                {
                    Comun.ShowInMainMessage("Requerido un # telefono del portador.");
                    this.txtTelefono.Focus();
                    return;
                }
            }
            #endregion

            FACTURAS_PAGOS fp = new FACTURAS_PAGOS();
            fp.ID_FACTURA = this.Entity.ID;
            fp.ID_TIPO = Convert.ToDecimal(this.cmbTipoPago.SelectedValue);
            fp.FACTURAS_PAGOS_TIPOS = new FACTURAS_PAGOS_TIPOS { ID = fp.ID_TIPO, TIPO = this.cmbTipoPago.Text };
            fp.ID_BANCO = Convert.ToDecimal(this.cmbBanco.SelectedValue);
            fp.BANCOS = new BANCOS { ID = fp.ID, BANCO = this.cmbBanco.Text };
            fp.ID_USUARIO = Comun.usuario.ID;
            if (this.cmbTipoPago.SelectedIndex == 3)
                fp.NRO_DOCUMENTO = string.Format("{0}-{1}", this.ncId, this.txtNroDocumento.Text.Trim());
            else
                fp.NRO_DOCUMENTO = this.txtNroDocumento.Text.Trim();
            fp.PORTADOR = this.txtPortador.Text.Trim();
            fp.TELEFONO = this.txtTelefono.Text.Trim();
            fp.FECHA = this.dtpFechaPago.Value;

            //validar pago con nota credito
            if (cmbTipoPago.SelectedIndex == 3)
            {
                if (ncMontoPendiente < monto)
                {
                    Comun.ShowInMainMessage("Monto a pagar es mayor que el monto disponible de la NC.");
                    this.txtMonto.Focus();
                    this.txtMonto.SelectAll();
                    return;
                }
            }

            double mPendiente = double.Parse(this.lblPendientePagar.Text);
            if (mPendiente > 0)
            {
                if (monto > mPendiente)
                {
                    this.lblMontoAdevolver.Text = (monto - mPendiente).ToString("N2");
                    fp.MONTO = Convert.ToDecimal(mPendiente);
                }
                else
                    this.lblMontoAdevolver.Text = "0.00";

                if (mPendiente >= monto)
                {
                    fp.MONTO = Convert.ToDecimal(monto);
                }
                this.Entity.FACTURAS_PAGOS.Add(fp);
                this.ncMontoPendiente = 0;
                this.ncId = 0;
            }
            else
                Comun.ShowInMainMessage("Pago ya está completo");

            this.bindingSource.DataSource = this.Entity.FACTURAS_PAGOS.ToList(); ;

            this.CalcularTotal();

            this.btnCancelarPago.PerformClick();
        }

        private void btnAceptar_Click(object sender, EventArgs e)
        {
            if (this.CuadrarConFactura && double.Parse(this.lblPendientePagar.Text) == 0)
            {
                this.DialogResult = System.Windows.Forms.DialogResult.OK;
                this.Close();
            }
            else
                Comun.ShowInMainMessage("La factura no está pagada por completo.");
        }

        private void txtOrdenCompra_TextChanged(object sender, EventArgs e)
        {
            if (this.txtMonto.Text.Trim() == string.Empty)
            {
                this.txtMonto.Text = "0.00";
                this.txtMonto.SelectAll();
            }
        }

        private void txtMonto_Validating(object sender, CancelEventArgs e)
        {
            decimal v = 0;
            if (decimal.TryParse(this.txtMonto.Text.Trim(), out v))
            {
                this.txtMonto.Text = v.ToString("N2");
            }
            else
            {
                Comun.ShowInMainMessage("Solo se permiten números.");
                this.txtMonto.Focus();
                this.txtMonto.SelectAll();
            }
        }

        private void btnCancelarPago_Click(object sender, EventArgs e)
        {
            this.cmbTipoPago.SelectedIndex = 0;
            this.dtpFechaPago.Value = this.Entity.FECHA_HORA;
            this.txtMonto.Text = "0.00";
            this.txtNroDocumento.Clear();
            this.cmbBanco.SelectedIndex = 0;
            this.txtPortador.Clear();
            this.txtTelefono.Clear();
            this.cmbTipoPago.Focus();

        }

        private void radGridView_UserDeletingRow(object sender, Telerik.WinControls.UI.GridViewRowCancelEventArgs e)
        {
            this.Entity.FACTURAS_PAGOS.Remove((FACTURAS_PAGOS)this.radGridView.CurrentRow.DataBoundItem);
            this.CalcularTotal();
        }

        private void txtMonto_Enter(object sender, EventArgs e)
        {
            this.txtMonto.Text = lblPendientePagar.Text;
            this.txtMonto.SelectAll();
        }

        private void frmFacturasPagos_FormClosing(object sender, FormClosingEventArgs e)
        {
            if (this.DialogResult != DialogResult.OK)
            {
                if (this.Entity != null && this.Entity.FACTURAS_PAGOS.Count > 0)
                    this.Entity.FACTURAS_PAGOS.Clear();
            }
        }

        private void frmFacturasPagos_Load(object sender, EventArgs e)
        {
            if (!this.cmbTipoPago.Enabled)
                this.Close();
        }

        private void txtNroDocumento_Validating(object sender, CancelEventArgs e)
        {
            if (this.cmbTipoPago.SelectedIndex == 3 && this.txtNroDocumento.Text.Trim() != string.Empty)
            {
                decimal i = 0;

                if (decimal.TryParse(this.txtNroDocumento.Text.Trim(), out i))
                {
                    List<NC> ncEntities = new NcBL().GetByNroDocumento(decimal.Parse(this.txtNroDocumento.Text.Trim()));
                    if (ncEntities.Count > 0)
                    {
                        Busquedas.frmNc frm = new Busquedas.frmNc(ncEntities);
                        frm.ShowDialog();
                        if (frm.DialogResult == System.Windows.Forms.DialogResult.OK)
                        {
                            NC selectedEntity = new NcBL().GetById(((NC)frm.radGridView.CurrentRow.DataBoundItem).ID);
                            this.ncMontoPendiente = Convert.ToDouble(selectedEntity.M_PENDIENTE);
                            this.ncId = selectedEntity.ID;
                            this.txtPortador.Text = selectedEntity.CLIENTES.CLIENTE;
                            this.txtTelefono.Text = selectedEntity.CLIENTES.TELEFONO;
                        }
                        else
                        {
                            this.txtNroDocumento.Focus();
                            this.txtNroDocumento.SelectAll();
                        }
                    }
                    else
                    {
                        Comun.ShowInMainMessage("No existen documentos con este número revise.");
                        this.txtNroDocumento.Focus();
                        this.txtNroDocumento.SelectAll();
                    }
                }
                else
                {
                    Comun.ShowInMainMessage("El No. Documento debe ser numerico");
                    this.txtNroDocumento.Focus();
                    this.txtNroDocumento.SelectAll();
                }
            }
        }
        #endregion
    }
}
